package com.wmx.jdbc_template_app.helper;


import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 1、spring 容器启动的时候会自动创建 ApplicationContextHelper 实例
 * 2、然后调用 setApplicationContext 回调方法自动注入 ApplicationContext
 * 3、有了 ApplicationContext 就可以 getBean 了
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2022/4/25 20:11
 */
@Component
public class ApplicationContextHelper implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextHelper.applicationContext = applicationContext;
    }

    /**
     * 根据名称获取容器中的对象实例
     *
     * @param beanName ：注入的实例必须已经存在容器中，否则抛异常：NoSuchBeanDefinitionException
     * @return
     */
    public static Object getBean(String beanName) {
        return applicationContext.getBean(beanName);
    }

    /**
     * 根据 class 获取容器中的对象实例
     *
     * @param requiredType ：被注入的必须已经存在容器中，否则抛异常：NoSuchBeanDefinitionException
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> requiredType) {
        return applicationContext.getBean(requiredType);
    }

    /**
     * 判断 spring 容器中是否包含指定名称的对象
     *
     * @param beanName
     * @return
     */
    public static boolean containsBean(String beanName) {
        return applicationContext.containsBean(beanName);
    }
}